#!/Pub/Apps/Cellar/R/4.1.2/lib/R/bin/Rscript 
suppressPackageStartupMessages(library(argparse))
suppressMessages(library(stringr))

wrp <- "转化生成h5ad文件，需要两个参数，第一个为seurat对象路径(rds or rdata)，第二个为od输出路径。"
parser <- ArgumentParser(
    prog='seurat_2_h5ad.r',
    description = wrp,
    formatter_class = "argparse.RawTextHelpFormatter"
    # usage = "seurat2loom_exprMat.r -h; seurat2loom_exprMat.r seurat_obj od"
)

parser$add_argument("seurat_obj", nargs = 1, help = "seurat对象路径。[rds or rdata]")
parser$add_argument("od", nargs = 1, help = "结果输出路径")

args_in_process <- parser$parse_args()

if (file.exists(str_glue(str_glue("{args_in_process$od}/seurat_h5ad.h5ad")))) {
    cli::cli_alert_warning("\nseurat_h5ad.h5ad已生成，转化跳过。\n")
    q()
}

suppressMessages(library(Seurat))

cli::cli_inform(">> [{Sys.time()}] Converting ...\n")

fn <- basename(args_in_process$seurat_obj)
if (grepl("rds", fn, ignore.case = T)) {
    ss_tmp <- readRDS(args_in_process$seurat_obj)
}
if (grepl("rdata", fn, ignore.case = T)) {
    tmp <- load(args_in_process$seurat_obj)
    ss_tmp <- get0(tmp)
}

f <- function(){
    cli::cli_alert_info("Seurat info:\n")
    print(ss_tmp)
    cat('\n')
}

library(SeuratDisk)

if(!dir.exists(args_in_process$od)){
    dir.create(args_in_process$od,recursive = T)
}

convert_Seurat <- function(x, od = "./", prefix = "nk", ...) {
    stopifnot("Seurat" %in% class(x))
    Sys.setenv(HDF5_USE_FILE_LOCKING = "FALSE")

    SeuratDisk::SaveH5Seurat(x, filename = str_glue("{od}/{prefix}.h5Seurat"))
    SeuratDisk::Convert(str_glue("{od}/{prefix}.h5Seurat"), dest = "h5ad")
    file.remove(str_glue("{od}/{prefix}.h5Seurat"))
}

convert_Seurat(ss_tmp, args_in_process$od, "seurat_h5ad")


cli::cli_inform(">> [{Sys.time()}] h5ad File Conversion Successful\n")
